package org.wang.generalcode.support.sm4;

import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SM4;



public class SM4Utils {
    /**
     * SM4是对称加密，需要设置一个加解密秘钥
     * <p>
     * System.out.println(Arrays.toString("@Wzd2024#$%^&*!+".getBytes(StandardCharsets.UTF_8)));
     * 特别注意字符串key的长度需要16位
     */
    private static final String keys = "40577a64323032342324255e262a212b";

    /**
     * 创建一个SM4加解密对象
     */
    private static final SM4 sm4 = SmUtil.sm4(HexUtil.decodeHex(keys));

    /**
     * 设置一个标识符，标识@SM4@- 开头的字符串是经过SM4加密的需要解密
     */
    public static final String SM4_PREFIX = "@SM4@-";


    /**
     * 对字符串进行加密
     *
     * @param value
     * @return
     */
    public static String encryptStr(String value) {
        // 对加密的字符串添加前缀，方便标识这是一个加密以后的字符串
        return SM4_PREFIX + sm4.encryptHex(value);
    }

    /**
     * 对字符串进行解密
     *
     * @param encryptValue
     * @return
     */
    public static String decryptStr(String encryptValue) {
        // 解密时，需要去除加密标识符
        return encryptValue.startsWith(SM4_PREFIX) ? sm4.decryptStr(encryptValue.substring(SM4_PREFIX.length())) : encryptValue;
    }

    public static void main(String[] args) {
        // 后台16字节密钥
        byte[] sm4Key = SecureUtil.generateKey("SM4").getEncoded();
        String key = "@Wzd2024#$%^&*!+";
        // 前台16进制密钥
        String hexKey = HexUtil.encodeHexStr(sm4Key);
        System.out.println("Generated SM4 Key (Hex): " + hexKey);
        String str1 = "postgres";
        str1 = SM4Utils.encryptStr(str1);
        System.out.println("经过SM4默认秘钥加密字符串: " + str1);

//        String str = "@SM4@-Fkq9kSY7q9qgfEOW3t+Kgw==";
        str1 = SM4Utils.decryptStr(str1);
        System.out.println("经过SM4默认秘钥解密字符串: " + str1);
//        System.out.println(Arrays.toString("@Wzd2024#$%^&*!+".getBytes(StandardCharsets.UTF_8)));
//        String str = "123";
//        System.out.println("原始字符串: " + str);
//        str = SM4Utils.encryptStr(str);
//        System.out.println("经过SM4默认秘钥加密字符串: " + str);
//        str = SM4Utils.decryptStr(str);
//        System.out.println("经过SM4默认秘钥解密字符串: " + str);

    }
}
